#!/usr/bin/python
# -*- coding: utf-8 -*-

"""
   Видеогалерея, основанная на youtube
"""

import logging
import gdata.geo
import config
#from gdata import media
from gdata.alt import appengine
from gdata import youtube
from gdata.youtube import service
#from gdata import urlfetch
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from engine import settings
from engine import pagegen

# enable info logging by the app
logging.getLogger().setLevel(logging.INFO)

def getVideos(playlistid = 'none', videoid = 'none'):
  """Получить видеоальбом.
  Args:
    playlistid: идентификатор плейлиста в youtube
    videosid: идентификатор плейлиста (список видео)
    videoid: идентификатор видеофайла

  Returns: данные альбома или фотографии
  """
  try:
    gd_client = gdata.youtube.service.YouTubeService()
    gd_client.email = config.GD_mail                     # username
    gd_client.password = config.GD_password              # password
    gd_client.source = config.GD_clientid                # YOUTUBE_CLIENT_ID; YOUTUBE_TEST_CLIENT_ID = 'ytapi-pythonclientlibrary_servicetest'  
    gd_client.developer_key = config.GD_devkey           # developer_key
    gd_client.client_id = config.GD_clientid             # YOUTUBE_CLIENT_ID; YOUTUBE_TEST_CLIENT_ID = 'ytapi-pythonclientlibrary_servicetest'  
    gd_client.debug = settings.DEBUG
    gdata.alt.appengine.run_on_appengine(gd_client)
    gd_client.ProgrammaticLogin()

    if playlistid == 'none' and videoid == 'none':                              # если ничего не задано
      data = gd_client.GetYouTubePlaylistFeed(username = config.GD_youtube)     # получаем список плейлистов пользователя
    elif playlistid != 'none':                                                  # если задан ид плейлиста
      data = gd_client.GetYouTubePlaylistVideoFeed(playlist_id = playlistid)    # получаем список роликов в нем
    elif videoid != 'none':                                                     # или получаем данные конкретного видео
      data = gd_client.GetYouTubeVideoEntry(video_id = videoid)
  except Exception, error:                                                      # если произошла ошибка...
    data = { 'error': 'Sorry, dude, service can`t load videos, please, come back later...' }
    logging.error( 'getVideos: Error = %s; playlsitid = %s; videoid = %s' % (error, playlistid, videoid) )

  return data

class VideoHandler(webapp.RequestHandler):
  """Класс-обработчик видеогалереи
  """

  def get(self):
    """Получить по методу GET галерею
    Args:
      self: класс-страница
    """

    playlistid = self.request.get('playlistid', default_value = 'none')     # получаем id плейлиста
    videoid = self.request.get('videoid', default_value = 'none')           # получаем id видеоролика

    page_template_values = {
      'portal_title': 'Видеогаларея ' + settings.SITETITLE,
      'page_description': 'наше видео'
    }

    data = getVideos(playlistid, videoid)                                   # получаем данные 
    if type(data) == dict:                                                  # если тип = dict значт возникла ошибка...
      action = 'error'
      entrys = data
    elif playlistid == 'none' and videoid == 'none':                        # если никакой из параметров не задан
      action = 'playlists'
      entrys = []
      for e in data.entry:                                                  # строим список с dict-элементами, содержащими параметры плейлиста
        id = e.id.text.split('/')
        id = id[len(id) - 1]
        entrys += [{ 'id': id,
                     'title': e.title.text,
                     'description': e.description.text,
                     'content': e.content.text,
                     'updated': e.updated.text,
                     'published': e.published.text }]
      page_template_values.update( logo = data.logo.text )                  # логотипчик
    elif playlistid != 'none':                                              # если задан ид плейлиста
      action = 'playlist'
      entrys = []
      for e in data.entry:                                                  # строим список с dict-элементами, содержащими видеоролики в плейлисте
        id = e.link[0].href.split('/')
        id = id[len(id) - 1].split('=')[1]
        entrys += [{ 'id': id,
                     'title': e.title.text,
                     'thumb': e.media.thumbnail[0].url,
                     'description': e.description.text,
                     'content': e.content.text,
                     'updated': e.updated.text, }]
                     #'published': e.published.text }]
      page_template_values.update( logo = data.logo.text, total = data.total_results.text ) # логотипчик и количество роликов
    elif videoid != 'none':                                                 # выбран конкретный ролик
      action = 'video'
      #player = 'yt'                                                         # для плеера с youtube
      player = 'my'                                                         # для своего плеера
      entrys = { 'geo': data.geo,                                           # строим dict с характеристиками видеоролика
                 'title': data.title.text,
                 'summary': data.summary,
                 'description': data.media.description.text,
                 'player': data.media.player.url,
                 'duration': data.media.duration.seconds,
                 'video': data.GetSwfUrl() }
      page_template_values.update( playersource = player )                  # задаем вид плеера (наш или ютубовский)
    
    page_template_values.update( action = action, entrys = entrys )         # задаем действие и содержание
    if action != 'error':
      page_template_values.update( author = data.author[0].name.text,       # параметры шаблона, общие для плейлистов, списков видео и роликов
                                   title = data.title.text,
                                   updated = data.updated.text )
     
    pagegen.generatePage(self, 'video', page_template_values)               # выводим страницу